#!/bin/bash
#Script de connection automatique au réseau wifi et au portail captif de l'université
#de Nancy-Metz
#Start 28/09/10
#Last edit : 5/10/10
#Last Comment : Ajout de libnotifysend
#Révision : stable
#Version : 1.2

#Var
ifconfig=$(which ifconfig)
iwconfig=$(which iwconfig)
dhcp=$(which dhcpcd)
notifysend=$(which notify-send)
usens="y" #Utiliser notify-send pour envoyer des messages sur la gestion des notifications du système
userandcard="y" #Utiliser une carte aléatoire
carte="wlan0" #Nom de l'interface WiFi
ap="CrousNet" #Nom de l'ap
rate="11M" #Vitesse de négociation de la liaison WiFi
gateway="192.168.221.254" #Adresse IP de la passerelle
#Var urlencoded
url="aHR0cDovL3d3dy5nb29nbGUuZnIvaWc%3D" #Code base64 d'une URL à charger après auth.
authen="AA%3A%3AAuthen-LDAP-METZ%3A%3AAuthz-LDAP-METZ" #Auth sur univ metz
#Var normal
user="" #Nom d'user
passwd="" # Mot de passe
useragent="Firefox/3.6.10"
cookies="auth.cookies"


sendmessage()
{
    if [ $usens = 'y' ]
    then
	$notifysend "Connexion au WiFi Univ. Nancy-Metz : 
	$1
	"
    fi
}
	
#Configuration de la carte WiFi et connection au WLAN.
cowifi()
{
    sudo $ifconfig $carte up
    sudo $iwconfig $carte ap 00:23:EB:B6:00:40 || echo association error
    sudo $iwconfig $carte essid $ap
    sudo $iwconfig $carte rate $rate auto
    sudo dhcpcd $carte&>/dev/null
}

#Vérification de la connectivité WLAN.
testcowlan()
{
    ping -c 1 $gateway &>/dev/null #On ping la passerelle et si elle répond on est connecté au WLAN
    if [ $? != 0 ]
    then
	echo "Erreur, impossible de contacter la passerelle ! Re-test dans 5s"
	sendmessage "Erreur, impossible de contacter la passerelle ! Re-test dans 5s"
	sleep 5s
	return 1
    else
	echo "Authentification en cours..."
	sendmessage "Authentification en cours..."
	return 0
    fi
}

#Authentification sur le portail captif.
authcaptiveportal()
{
    curl -m 10 --connect-timeout 10 -# -L --referer "https://portail-crous.crous-nancy-metz.fr/?url="$url"" --user-agent "Firefox/3.6.10" https://portail-crous.crous-nancy-metz.fr/gotoauthen --data-urlencode url="$url" --data-urlencode accept="1" --data-urlencode authen="$authen" -o /dev/null
    #Renvoie vers URL=https://portail-crous.crous-nancy-metz.fr/login?url=aHR0cDovL3d3dy5nb29nbGUuZnIvaWc=&authen=AA::Authen-LDAP-METZ::Authz-LDAP-METZ
    curl -m 10 --connect-timeout 10 -# --referer "https://portail-crous.crous-nancy-metz.fr/login?url="$url"&authen="$authen"" --user-agent "$useragent" https://portail-crous.crous-nancy-metz.fr/authen-ldap -d url="$url" -d authen="$authen" -d user="$user" -d pwd="$passwd" -d accept="on" -d Submit="Valider" -c $cookies -o /dev/null
    if [ $? != 0 ] #Si curl retourne un code d'erreur, on repasse au test de la conenctivité WLAN.
    then
	echo "Impossible de s'authentifier... On se reconnecte au réseau WLAN."
	sendmessage "Impossible de s'authentifier... On se reconnecte au réseau WLAN."
	testcowlan
	if [ $? != 0 ] #Si on est pas connecté au WLAN, on reprend du début, sinon on relance l'auth.
	then
	    start
	else
	    authcaptiveportal
	fi
    fi
    echo "Connexion ok ;)"
    sendmessage "Connexion ok ;)"
    while sleep 30s # Toute les 30s on met à jour le cookie, pour rester connecter, timeout sur 2min.
    do
	echo "Mise à jour du cookie"
	keepconnected=$(curl -m 10 --connect-timeout 10 -# https://portail-crous.crous-nancy-metz.fr/popup -b $cookies | grep "Connect&eacute;")
	if [ $? != 0 ] #Si on peut pas mettre à jour, on se ré-auth.
	then
	    echo "Oups, il semblerait que l'on ait été deconnecté, on se re-authentifie."
	    sendmessage "Oups, il semblerait que l'on ait été deconnecté, on se re-authentifie."
	    authcaptiveportal
	fi
    done
}

start()
{
    cowifi
    testcowlan
    if [ $? != 0 ]
    then
	echo "Retentative de connection au WLAN..."
	sendmessage "Retentative de connection au WLAN..."
	sleep 5s
	start
    else
	authcaptiveportal
    fi
}

#On lance le script :D
start
